package com.xm.design_patterns;

/**
 * Author：xm
 * Project：interview
 * Date：2025/8/4  15:36
 */

// DCL双重检查锁
public class _022_DCLSingleton {
    /*
    若是不加volatile关键字，可能会存在JVM指令重排，可能用多线程尝试几万次都不一定能发现。
    new Person()底层其实分为3步：
    memory = allocate(); // 1: 分配内存
    initialize(memory); // 2: 初始化对象
    object = memory; // 3: 设置对象引用
    由于指令重排（JVM的一种优化机制），JVM可能会优先执行第1步和第3步，然后再执行第2步。
    在多线程情况下，其他线程可能会看到这个尚未初始化完毕的对象，从而导致不可预期的行为
     */
    private static volatile _022_DCLSingleton instance = null;

    private _022_DCLSingleton() {
    }

    public static _022_DCLSingleton getInstance() {
        if (instance == null) { // 第一次校验
            synchronized (_022_DCLSingleton.class) {
                if (instance == null) { // 第二次校验
                    instance = new _022_DCLSingleton();
                }
            }
        }
        return instance;
    }
}